import 'package:flutter/material.dart';

void main() => runApp(MyApp());

// 定义根目录Wigdget
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 根视图
    return MaterialApp(
      // 路由配置
      routes: {
        // 默认显示路由页面
        "/": (BuildContext context) => FirstPage(),
        "/second": (BuildContext context) => SecondPage(),
      },
    );
  }
}

// 第一个页面
class FirstPage extends StatefulWidget {
  @override
  _FirstPageState createState() => _FirstPageState();
}

class _FirstPageState extends State<FirstPage> {
  // 接受B页面传给A页面你的值
  String result = "";
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("A页面")),
      body: Column(children: [
        ElevatedButton(
          onPressed: () {
            openBFunction();
          },
          child: Text("点击打开B页面"),
        ),
        ElevatedButton(
          onPressed: () {
            openBAndResultFunction();
          },
          child: Text("点击打开b页面,并获取B页面返回的参数"),
        ),
        ElevatedButton(
          onPressed: () {
            openB();
          },
          child: Text("点击打开动态路由B"),
        ),
        Container(
          child: Text("页面B返回的参数 $result"),
        ),
      ]),
    );
  }

  void openBFunction() {
    Map<String, String> map = new Map();
    map["name"] = "张三";
    // 跳转到第二个页面
    Navigator.of(context).pushNamed("/second", arguments: map);
  }

  void openBAndResultFunction() {
    Map<String, String> map = new Map();
    map["name"] = "张三";
    // 跳转到第二个页面
    Navigator.of(context).pushNamed("/second", arguments: map).then((value) {
      // 当关闭第二个页面不设置值的时 value 为null
      if (value != null) {
        Map<String, String> resultMap = value;
        print("页面二回传的数据是 ${resultMap["result"]}");
        setState(() {
          result = resultMap["result"];
        });
      }
    });
  }

  // 动态路由方式打开B页面
  void openB() {
    Navigator.of(context).push(new MaterialPageRoute(builder: (_) {
      return new SecondPage(title: "这是传递的参数");
    })).then((value) {
      if (value != null) {
        Map<String, String> resultMap = value;
        print("页面二回传的数据是 ${resultMap["result"]}");
        setState(() {
          result = resultMap["result"];
        });
      }
    });
  }
}

// 第二个页面

class SecondPage extends StatefulWidget {
  final String title;
  SecondPage({this.title});
  @override
  _SecondPageState createState() => _SecondPageState();
}

class _SecondPageState extends State<SecondPage> {
  // 记录传过来的参数
  String _message = "";
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
  }

  @override
  void didChangeDependencies() {
    // TODO: implement didChangeDependencies
    super.didChangeDependencies();
    // 是否是路由栈中的第一个页面
    bool isFirst = ModalRoute.of(context).isFirst;
    // 当前手机屏幕上显示的是否是这个页面Widget
    bool isCurrent = ModalRoute.of(context).isCurrent;
    // 当前widget是否是活跃可用的
    // 当调用pop 或者是关闭当前Widget时 isActive 为false;
    bool isActive = ModalRoute.of(context).isActive;
    if (isActive) {
      // 获取路由信息
      RouteSettings routeSettings = ModalRoute.of(context).settings;
      Map<String, String> arguments = routeSettings.arguments;
      if (arguments != null) {
        print(
            "接收到的参数 ${arguments["name"]} isCurrent $isCurrent isActive $isActive isFirst $isFirst");
        _message = arguments.toString();
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("B页面 ${widget.title}")),
      body: Column(
        children: [
          FlatButton(
            onPressed: () {
              closeBFunction();
            },
            child: Text("关闭当前页面"),
          ),
          SizedBox(
            height: 20,
          ),
          Text("接受到的数据是 $_message"),
        ],
      ),
    );
  }

  void closeBFunction() {
    Map<String, String> resultMap = new Map();
    resultMap["result"] = "GGB";
    // 回传数据
    Navigator.of(context).pop(resultMap);
  }
}
